#include "TetrisBlok.h"

TetrisBlok::TetrisBlok()
{
	active = false;
}
TetrisBlok::TetrisBlok(int what)
{
	// constructor
//	blokken = new Blok[4];
	blokken = new Blok[4];

//	x = y = z = 0;

	// WUT BLOK R WE DRaWING HRE?!
	
	// x
	// xxx   for now


	// blokken[0] = main point
	switch(what)
	{
	case 0:
		// x
		// xxx
		blokken[1].attachTo(0, TOP);
		blokken[2].attachTo(0, RIGHT);
		blokken[3].attachTo(2, RIGHT);
		break;

	case 1:
		// xxxx
		blokken[1].attachTo(0, RIGHT);
		blokken[2].attachTo(1, RIGHT);
		blokken[3].attachTo(2, RIGHT);
		break;
	case 2:
		//  x
		// xxx
		blokken[1].attachTo(0, RIGHT);
		blokken[2].attachTo(1, TOP);
		blokken[3].attachTo(1, RIGHT);
		break;

	case 3:
		// xx
		// xx
		blokken[1].attachTo(0, RIGHT);
		blokken[2].attachTo(1, TOP);
		blokken[3].attachTo(2, LEFT);
		break;

	case 4:
		//  xx
		// xx
		blokken[1].attachTo(0, RIGHT);
		blokken[2].attachTo(1, TOP);
		blokken[3].attachTo(2, RIGHT);
		break;

	case 5:
		// xx
		//  xx
		blokken[1].attachTo(0, RIGHT);
		blokken[2].attachTo(1, BOTTOM);
		blokken[3].attachTo(2, RIGHT);
		break;

	case 6:
		//   x
		// xxx
		blokken[1].attachTo(0, RIGHT);
		blokken[2].attachTo(1, RIGHT);
		blokken[3].attachTo(2, TOP);
		break;
	}
	int random = rand()%5;	// normal, left, upside down, right
	
	for (int i=0; i < random; i++)
		this->rotate(true);
	
		this->r = float(rand()%100)/100;
		this->g = float(rand()%100)/100;
		this->b = float(rand()%100)/100;

		
//	blokken[0].setKleur(1,0,0);
	for (int i=0; i < 4; i++)
		blokken[i].setKleur(r,g,b);

	this->calcPositions();
}

void TetrisBlok::setPos(float x, float y, float z)
{
//	this->x = x;
//	this->y = y;
//	this->z = z;
	blokken[0].setPos(x,y,z);
	this->calcPositions();
}

void TetrisBlok::drop()
{
	// deprecated


	for (int i=0; i < 4; i++)
	{
		blokken[i].setPos(blokken[i].fX, blokken[i].fY - 2*blokSize, blokken[i].fZ);
	}
//	this->y -= 2*blokSize;

}
void TetrisBlok::calcPositions()
{
	for (int i=1; i < 4; i++)
	{
		Blok rel = blokken[blokken[i].iAttachedTo];
		switch (blokken[i].iAttachMode)
		{
		case BOTTOM:
			blokken[i].setPos(rel.fX, rel.fY-blokSize*2, rel.fZ);
			break;
		case LEFT:
			blokken[i].setPos(rel.fX-blokSize*2, rel.fY, rel.fZ);
			break;
		case RIGHT:
			blokken[i].setPos(rel.fX+blokSize*2, rel.fY, rel.fZ);
			break;
		case TOP:
			blokken[i].setPos(rel.fX, rel.fY+blokSize*2, rel.fZ);
			break;
		}
	}
}
void TetrisBlok::rotate(bool klok)
{
	// Todo: fix positioning
	for (int i=0; i < 4; i++)
	{
		if (klok)
		{
			if (blokken[i].iAttachMode == LEFT)
				blokken[i].iAttachMode = TOP;
			else
				blokken[i].iAttachMode++;
		}else {
			if (blokken[i].iAttachMode == TOP)
			{
				blokken[i].iAttachMode = LEFT;

			}
			else
				blokken[i].iAttachMode --;

		}
	}
	this->calcPositions();
}

void TetrisBlok::draw()
{
	// draw 0

	for (int i=0; i <= 4; i++)
	{
		blokken[i].draw();
	}
}

void TetrisBlok::moveLeft()
{
	blokken[0].setPos(blokken[0].fX - blokSize*2, blokken[0].fY, blokken[0].fZ);	
	calcPositions();
}
void TetrisBlok::moveRight()
{
	blokken[0].setPos(blokken[0].fX + blokSize*2, blokken[0].fY, blokken[0].fZ);	
	calcPositions();
}	